//package com.loong.game2048.aop;
//
//import com.loong.game2048.Exception.BizException;
//import com.loong.game2048.module.ResultCode;
//import com.loong.game2048.module.vo.Result;
//import com.loong.game2048.server.UserServer;
//import com.loong.game2048.util.RedisUtils;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//
///**
// * aop方式实现拦截
// * @author lyx
// * @date 2020/5/14 16:18
// */
//@Aspect
//@Component
//public class AuthorizationAspect {
//
//
//    @Resource
//    private RedisUtils redisUtils;
//
//    @Autowired
//    private UserServer userServer;
//
//
//    /**
//     * 切入点为注解的： @annotation(Authorize)
//     * 存在 Authorize 注解的方法
//     */
//    @Pointcut("@annotation(com.loong.game2048.annotation.Authorize)")
//    private void permission() {
//
//    }
//
//    /**
//     * 目标方法调用之前执行
//     */
//    @Before("permission()")
//    public void doBefore() {
//
//    }
//
//    /**
//     * 目标方法调用之后执行
//     */
//    @After("permission()")
//    public void doAfter() {
//
//    }
//
//    /**
//     * 环绕
//     * 会将目标方法封装起来
//     * 具体验证业务数据
//     */
//    @Around("permission()")
//    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//
//        Result msg = new Result();
//
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request = attributes.getRequest();
//        String token = request.getHeader("token");
//
//        if (StringUtils.isEmpty(token)) {
//            //请求中没有带token
//            throw new BizException("非法请求，无效token");
//        }
//        // 校验token的业务逻辑
//        //获得redis中的token
//        String sessionKey ;
//        if (redisUtils.hasKey(token)&&redisUtils.getExpire(token)>=0){
//            //将redis中的json序列转成对象
//            sessionKey = (String) redisUtils.get(token);
//        }else{
//            //redis中不存在token或token已过期
//            msg.setCode(ResultCode.SUCCESS);
//            msg.setMsg("redis中不存在token或token已过期,请重新登录");
//            return msg;
//        }
//
//        //刷新token 缓存时长为24小时
//        redisUtils.expire(token,86400);
//
//        String[] s = token.split("\\:");
//        if (s.length>1){
//            if (userServer.getUserCountById(s[1]) <= 0){
//                msg.setCode(ResultCode.UNSPECIFIED);
//                msg.setMsg("用户不存在，请重新登录");
//                return msg;
//            }
//
//            //执行具体方法
//            Object result = proceedingJoinPoint.proceed();
//
//            return result;
//
//        }else{
//            msg.setCode(ResultCode.UNSPECIFIED);
//            msg.setMsg("token格式错误");
//            return msg;
//        }
//    }
//
//
//}
